#ifndef __PID_H
#define __PID_H			

#include "stdio.h"
#include "stdint.h"

#define BLOOD_PWMDUTY_LOW  		 60 //代表60%占空比  设置的pwm周期 2ms 正好周期数值设置的是100
#define EHP_PWMDUTY_LOW  		   60 //代表60%占空比  设置的pwm周期 2ms 正好周期数值设置的是100
#define FT_PWMDUTY_LOW  		   60 //代表60%占空比  设置的pwm周期 2ms 正好周期数值设置的是100

#define BLOOD_PWMDUTY_UPPER    100 //代表100%占空比  设置的pwm周期 2ms 正好周期数值设置的是100
#define EHP_PWMDUTY_UPPER    	 100 //代表100%占空比  设置的pwm周期 2ms 正好周期数值设置的是100
#define FT_PWMDUTY_UPPER    	 100 //代表100%占空比  设置的pwm周期 2ms 正好周期数值设置的是100
#define FT2_PWMDUTY_UPPER    	 100 //代表100%占空比  设置的pwm周期 2ms 正好周期数值设置的是100
#define PID_PWMDUTY_UPPER      100//pid使用判断最高占空比的数值

#define BLOOD_PWMDUTY_DEFAULT  20//20220701修改电路反向了   80 //开机默认80%占空比 
#define EHP_PWMDUTY_DEFAULT    20//80 //开机默认80%占空比 
#define FT_PWMDUTY_DEFAULT     20//80 //开机默认80%占空比 
#define FT2_PWMDUTY_DEFAULT    20//80 //开机默认80%占空比  20220622

#define BLOOD_PWMDUTY_NULL    0 //代表低电平
#define EHP_PWMDUTY_NULL    	 0 //代表低电平
#define FT_PWMDUTY_NULL    	 0 //代表低电平
#define FT2_PWMDUTY_NULL    	 0 //代表低电平

#define FT_PWMDUTY_DOWN    	 	 10 //代表接近于powerdown的pwm输出 用于判断机械热断器的门限 当低于此值 机械热断器无法判断 认为正常
#define FT2_PWMDUTY_DOWN    	 10 //代表接近于powerdown的pwm输出 用于判断机械热断器的门限

#define NUM_FILTER				10//使用pid前的数据滤波个数


struct Pid_Value
{
    float       Set_Point;  //设定目标
    float       Now_Point;  //当前数值
    float       Sum_Error;  //错误累加
    float       Now_Error;  //本次偏差
    float       Pre_Error;  //上次偏差
    float       Kp;         //比例常数
    float       Ti;         //积分常数
    float       Td;         //微分常数
    float       Pout;
    float       Iout;
    float       Dout;
    float       Out;
//    float       Out0;
		uint16_t 		LastOut;		// 上一次输出的PWM
		float       OutReal;
    float 			sout;
    
    uint8_t     Pid_Start;
    float       T;          //PID计算周期
    uint16_t    Pwm_Cycle;  //Pwm的周期
    uint8_t     Meun_Flag;
    float				L1_out;//升温第一阶段输出pwm 线性段
		float				L2_out;//升温第二阶段输出pwm 线性段
		float				L0_out;//降温阶段输出pwm 线性段
		int8_t    L1_settemp;//升温第一阶段的温度差门限
		int8_t    L2_settemp;//升温第二阶段的温度差门限
		int8_t    L0_settemp;//降温阶段的温度差门限
};


extern struct Pid_Value  pid_parm_device;

//float Pid_Calculate(float Now_temp, struct Pid_Value pid); //pid算法
float Pid_Calculate(float Now_temp, struct Pid_Value *pid, uint8_t channel);//pwm简易控制
void blood1_PidStopOut(void);
float Pid_Calculate_real(float Now_temp, struct Pid_Value *pid, uint8_t channel);

void InitPid_Device_ft(void);
void InitPid_Device_blanket(void);

float mean_filter(float *indata, uint8_t cal_cnt, uint8_t num_total);

#endif  
	 



